#include "bdd.h"

uint
td_open_base (char *se, byte c_s, byte mode)
{
  racine *tmp;
  uint sid;
  td_err = 0;
  tmp = get_base (root_head, se);
  if (tmp)
    {
      td_err = ALREADY_EXIST;
      return 0;
    }

  if (mode == O_VIRTUAL && mode != O_AUTO && mode != O_MANUAL)
    {
      td_err = INVALID_MODE;
      return 0;
    }

  if (c_s != CASE_SENS && c_s != NO_CASE_SENS)
    {
      td_err = INVALID_CASE;
      return 0;
    }

  if (!valid_basename (se))
    {
      td_err = INVALID_STRING;
      return 0;
    }

  if (!read_bdd (se, mode, c_s))
    return 0;

  sid = add_session ();
  sess_tab[sid]->subptr = root_head->base;
  sess_tab[sid]->rowptr = NULL;
  sess_tab[sid]->baseptr = root_head->base;
  sess_tab[sid]->rootptr = root_head;
  return (sid);
}

byte
td_close_session (uint si)
{
  td_err = 0;
  if (si > sess_top || !sess_tab[si] || !si)
    {
      td_err = INVALID_SESSION;
      return 0;
    }
  free_session (si);

  return 1;
}

byte
td_write_base (uint si)
{
  session *stmp;
  td_err = 0;
  stmp = get_session (si);
  if (!stmp)
    {
      td_err = INVALID_SESSION;
      return 0;
    }
  if (!stmp->subptr)
    {
      td_err = INVALID_SUBBASE;
      return 0;
    }
  if (stmp->rootptr->mode == O_VIRTUAL)
    {
      td_err = INVALID_MODE;
      return 0;
    }

  if (write_bdd (stmp->baseptr))
    return 1;
  td_err = CANT_WRITE;
  return 0;
}

byte
td_close_base (uint si)
{
  session *stmp;
  td_err = 0;
  stmp = get_session (si);
  if (!stmp)
    {
      td_err = INVALID_SESSION;
      return 0;
    }
  if (!stmp->baseptr || !stmp->rootptr)
    {
      td_err = INVALID_BASE;
      return 0;
    }

  if (!session_on_base (stmp->baseptr, si))
    root_head = del_base (root_head, stmp->rootptr);

  free_session (si);
  return 1;
}
